package com.paipai.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONPObject;
import com.github.pagehelper.PageHelper;
import com.paipai.dao.ProductMapper;
import com.paipai.entity.EsProduct;
import com.paipai.entity.Product;
import com.paipai.entity.ProductParams;
import com.paipai.esdao.ProductRepository;

import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.entity.Example.Criteria;

@Service
public class productService {
	@Autowired
	private ProductMapper productMapper;

	@Autowired
	private RedisTemplate<String, String> redistemplate;

	@Autowired
	private ProductRepository productRepository;

	// 首页热点商品
	/**
	 * 首页热度商品
	 * 
	 * @return
	 */
	// @Limit
	public List<Product> heatIndexProduct() {

		// 从redis 热度商品获取id
		ZSetOperations<String, String> zSet = redistemplate.opsForZSet();

		// 批量获取redis hash的键值对
		HashOperations<String, String, String> hash = redistemplate.opsForHash();

		// 反序
		Set<String> set = zSet.reverseRange("heat.product", 0, 4);

		List<Product> list = productMapper.indexFindProductByHeatCount();
		// 如果relis 热度排行榜 数量小于5个 从数据库查询

		return list;

	}

	/**
	 * 首页最新商品
	 * 
	 * @return
	 */
	public List<Product> neweIndexProduct() {
		List<Product> list = productMapper.neweIndexProduct();
		return list;
	}

	/**
	 * 首页优惠商品
	 * 
	 * @return
	 */
	public List<Product> discountsProduct() {
		List<Product> list = productMapper.discountsProduct();
		return list;
	}

	/**
	 * 用户搜索商品
	 * 
	 * @param key
	 * @param category
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public HashMap<String, Object> userSearchProduct(ProductParams proParams) {
		// 查询数据总量 关键字 类型 区域
		Integer count = productMapper.userSearchProductCountBykeyAndcategory(proParams.getKey(),
				proParams.getCategory(), proParams.getRegion());

		// 查询总页数
		Integer pageSize = proParams.getPageSize();
		Integer pageCount = count % pageSize == 0 ? count / pageSize : (count / pageSize) + 1;

		// 分页工具 只对最后一条sql有效
		Integer pageNum = proParams.getPageNum();
		PageHelper.startPage(pageNum, pageSize);

		// 关键字 类型 区域
		List<Product> list = productMapper.userSearchProductBykeyAndcategory(proParams.getKey(),
				proParams.getCategory(), proParams.getRegion());
		HashMap<String, Object> map = new HashMap<String, Object>();

		// 将总页数放入map
		map.put("pageCount", pageCount);
		// 数据总条数
		map.put("count", count);
		// 当前页
		map.put("pageNum", pageNum);
		// 每页数量
		map.put("pageSize", pageSize);
		// 当前数据量
		map.put("list", list);
		return map;
	}

	/**
	 * 用户搜索商品(Es)
	 * 
	 * @param key
	 * @param category
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public HashMap<String, Object> userSearchEsProduct(ProductParams proParams) {
		
		NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
		
		//查询条件
		BoolQueryBuilder query = QueryBuilders.boolQuery();

		

		// 如果 关键词 不等于null
		if(proParams.getKey() != null && ! "".equals(proParams.getKey())) {
			query.must(QueryBuilders.multiMatchQuery(proParams.getKey(), "info", "proName"));
		}
		//如果分类不等于null
		if (proParams.getCategory() != null &&! "".equals(proParams.getCategory())) {
			query.must(QueryBuilders.matchPhraseQuery("type", proParams.getCategory()));
		} 
		//如果地区不等于null
		if (proParams.getRegion() != null && ! "".equals(proParams.getRegion())) {
			query.must(QueryBuilders.matchPhraseQuery("region", proParams.getRegion()));
		}
		
		queryBuilder.withQuery(query);
		
		// 设置分页参数  
		queryBuilder.withPageable(new PageRequest(proParams.getPageNum()-1, proParams.getPageSize()));

		// 排序 以发布时间倒序排
		queryBuilder.withSort(SortBuilders.fieldSort("startTime").order(SortOrder.DESC));

		// 执行搜索，获取结果
		Page<EsProduct> items = productRepository.search(queryBuilder.build());
		
		
		
		List<EsProduct>list = new ArrayList<EsProduct>();
		
		items.forEach(epro->{list.add(epro);});
		
		HashMap<String, Object> map = new HashMap<String, Object>();

		// 将总页数放入map
		map.put("pageCount", items.getTotalPages());
		// 数据总条数
		map.put("count", items.getTotalElements());
		// 当前页
		map.put("pageNum", items.getNumber()+1);
		// 每页数量
		map.put("pageSize", items.getSize());
		// 当前数据量
		map.put("list",  list);
		
		return map;
	}

	/**
	 * 获取商品详情
	 * 
	 * @param id
	 * @return
	 */
	public Product ProductParticulars(Integer id) {
		// 使用redis zset统计热度
		ZSetOperations<String, String> zSet = redistemplate.opsForZSet();
		// 对zset 自增加分值 以商品id为键
		Double score = zSet.incrementScore("heat.product", id.toString(), 1);

		// 更新商品热度
		Integer row = productMapper.updateHeatcountById(id);

		// 查询商品
		Product pro = productMapper.selectByPrimaryKey(id);

		// 商品的redis
		HashOperations<String, String, String> hash = redistemplate.opsForHash();
		// 放入redis
		hash.put("product", id.toString(), JSON.toJSONString(pro));

		return pro;

	}

	/**
	 * 将storage转移到redis
	 * 
	 * @param proids
	 * @return
	 */
	public List<Product> finProductListByIds(String proids) {

		List<Product> list = productMapper.finProductListByIds(proids);
		return list;
	}

	// 查询到期商品
	public List<Product> findAllProductEndDate() {

		return productMapper.findAllProductEndDate();
	}

	/**
	 * 接受消息更新商品状态
	 * 
	 * @param map
	 */

	public int updateProductStatus(HashMap<String, Object> map) {

		Product product = new Product();
		// 商品id
		product.setId(Integer.parseInt(map.get("id").toString()));
		// 状态
		product.setPutaway(Integer.parseInt(map.get("state").toString()));

		// 如果竞拍成功就不为null
		if (map.get("biduserId") != null) {
			product.setBiduserId(Integer.parseInt(map.get("state").toString()));
		}
		if (map.get("biduserName") != null) {
			product.setBiduserName(map.get("state").toString());
		}

		int row = productMapper.updateByPrimaryKeySelective(product);
		return row;

	}

}
